package me.ydq.core.table;

import me.ydq.mapper.Mapping;
import me.ydq.misc.PageData;
import org.springframework.jdbc.core.RowMapper;

import java.util.List;

/**
 * 和 page 查询比较相似，只是分页参数为 offset/size，会自动查询 count
 */
public interface TableSlice<T> extends TableList<T>, TableCount {

    /**
     * 适合于查询类似于 distinct x 这样的字段
     */
    default <R> PageData<R> slice(int offset, int size, RowMapper<R> mapper) {
        List<R> list  = list(offset, size, mapper);
        Integer count = offset == 0 && list.isEmpty() ? 0 : count();
        return new PageData<>(list, count);
    }


    /**
     * 适合于查询单个字段的分页，以 offset/size 进行分页
     */
    default <R> PageData<R> slice(int offset, int size, Class<R> returnType) {
        List<R> list  = list(offset, size, returnType);
        Integer count = offset == 0 && list.isEmpty() ? 0 : count();
        return new PageData<>(list, count);
    }

    /**
     * 适合于查询单个字段的分页，以 offset/size 进行分页
     */
    default <R> PageData<R> slice(int offset, int size, Mapping<R> returnType) {
        List<R> list  = list(offset, size, returnType);
        Integer count = offset == 0 && list.isEmpty() ? 0 : count();
        return new PageData<>(list, count);
    }

    /**
     * 以 offset/size 进行分页
     */
    default PageData<T> slice(int offset, int size) {
        return slice(offset, size, rowMapper());
    }
}
